package okw.network;

import java.io.Serializable;

import okw.database.DatabaseManager;
import okw.database.Election;
import okw.database.State;
import okw.gui.MainWindowO;
import core.messages.Info;
import core.messages.IStan;
import core.modules.Serializer;

public class StanO implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7029115916678288935L;
	private  boolean wlaczony = false;
	private  boolean nasluchiwanie = false;
	private  boolean polaczenie = false;
	private  boolean glosowanieRozpoczete = false;
	private  boolean konczenieGlosowania = false;
	private  boolean glosowanieZakonczone = false;
	private  String  electionName;
	private  boolean daneWyborcze = false;
	private  boolean konfiguracja = false;
	private  int nrwiadomosci = 0;

	
	// pobiera numer wiadomosci
	public  synchronized int getNr(){
		nrwiadomosci++;
		DatabaseManager db = DatabaseManager.getInstance();
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		return nrwiadomosci;
	}
	
	public  synchronized void zeruj() {
		wlaczony = false;
		nasluchiwanie = false;
		polaczenie = false;
		glosowanieRozpoczete = false;
		konczenieGlosowania = false;
		glosowanieZakonczone = false;
		electionName = null;
		daneWyborcze = false;
		konfiguracja = false;
		nrwiadomosci = 0;
		DatabaseManager db = DatabaseManager.getInstance();
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
	}
	
	
	public  synchronized boolean isWlaczony() {
		return wlaczony;
	}
	
	public  synchronized void setWlaczony(boolean wlaczony) {
		this.wlaczony = wlaczony;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		DatabaseManager db = DatabaseManager.getInstance();
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}
	
	public  synchronized boolean isNasluchiwanie() {
		return nasluchiwanie;
	}

	public  synchronized void setNasluchiwanie(boolean nasluchiwanie) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.nasluchiwanie = nasluchiwanie;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public  synchronized boolean isPolaczenie() {
		return polaczenie;
	}

	public  synchronized void setPolaczenie(boolean polaczenie) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.polaczenie = polaczenie;
		try {
			if(polaczenie){
				core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
						glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
				
				//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
				MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public  synchronized boolean isGlosowanieRozpoczete() {
		return glosowanieRozpoczete;
	}

	public  synchronized void setGlosowanieRozpoczete(boolean glosowanieRozpoczete) {
		DatabaseManager db = DatabaseManager.getInstance();
		if(glosowanieRozpoczete){
			Election election = db.get(Election.class, MainWindowO.electionNr);
			election.setStatus(1);
			election.setActualStartDate(db.getCurrentTime());
			db.update(election);
		}
		this.glosowanieRozpoczete = glosowanieRozpoczete;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public  synchronized boolean isKonczenieGlosowania() {
		return konczenieGlosowania;
	}

	public  synchronized void setKonczenieGlosowania(boolean konczenieGlosowania) {

		DatabaseManager db = DatabaseManager.getInstance();
		if(glosowanieZakonczone== true){
			Election election = db.get(Election.class, MainWindowO.electionNr);
			election.setStatus(2);
			db.update(election);
		}
		this.konczenieGlosowania = konczenieGlosowania;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(nrwiadomosci, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}
	
	public synchronized boolean isDaneWyborcze() {
		return daneWyborcze;
	}

	public synchronized void setDaneWyborcze(boolean daneWyborcze) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.daneWyborcze = daneWyborcze;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
		//	System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public boolean isKonfiguracja() {
		return konfiguracja;
	}

	public void setKonfiguracja(boolean konfiguracja) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.konfiguracja = konfiguracja;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
		
	}

	public String getElectionName() {
		return electionName;
	}

	public void setElectionName(String electionName) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.electionName = electionName;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public boolean isGlosowanieZakonczone() {
		return glosowanieZakonczone;
	}

	public void setGlosowanieZakonczone(boolean glosowanieZakonczone) {
		DatabaseManager db = DatabaseManager.getInstance();
		if(glosowanieZakonczone== true){
			Election election = db.get(Election.class, MainWindowO.electionNr);
			election.setStatus(3);
			db.update(election);
		}
		this.glosowanieZakonczone = glosowanieZakonczone;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, glosowanieZakonczone, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Serializer.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}
	
/*
	public  synchronized boolean isZaczacGlosowanie() {
		return zaczacGlosowanie;
	}

	public  synchronized void setZaczacGlosowanie(boolean zaczacGlosowanie) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.zaczacGlosowanie = zaczacGlosowanie;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, zaczacGlosowanie, 
					zakonczycGlosowanie, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Coder.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}

	public  synchronized boolean isZakonczycGlosowanie() {
		return zakonczycGlosowanie;
	}
	
	public  synchronized void setZakonczycGlosowanie(boolean zakonczycGlosowanie) {
		DatabaseManager db = DatabaseManager.getInstance();
		this.zakonczycGlosowanie = zakonczycGlosowanie;
		try {
			core.messages.StanO msgStan = new core.messages.StanO(wlaczony, nasluchiwanie, polaczenie, 
					glosowanieRozpoczete, konczenieGlosowania, zaczacGlosowanie, 
					zakonczycGlosowanie, daneWyborcze, nrwiadomosci, konfiguracja, electionName);
			
			//System.out.println("STANTEST: " + msgStan + " " + nrwiadomosci);
			MainWindowO.cm.sendUp(new Info(getNr(), 5, msgStan));
		} catch (Exception e) {
			e.printStackTrace();
		}
		State state = new State(1, Coder.OToS(this));
		db.saveState(state);
		MainWindowO.changeState();
	}
*/
}
